home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 1 (Walnut Creek)
/
Aminet - June 1993 [Walnut Creek].iso
/
usenet
/
sources
/
volume89
/
fun
/
pz.1
< prev
next >
Wrap
Text File
|
1989-03-09
|
21KB
|
593 lines
Path: xanth!lll-winken!ames!ll-xn!adelie!infinet!ulowell!page
From: page@swan.ulowell.edu (Bob Page)
Newsgroups: comp.sources.amiga
Subject: v89i039: pz - slide-the-tiles-around puzzle
Message-ID: <12084@swan.ulowell.edu>
Date: 8 Mar 89 20:23:27 GMT
Organization: University of Lowell, Computer Science Dept.
Lines: 582
Approved: page@swan.ulowell.edu
Submitted-by: migh@cuuxb.ATT.COM (Mike Hall)
Posting-number: Volume 89, Issue 39
Archive-name: fun/pz.1
[I put the small executable and the 15 tile images in a zoo, uuencoded
it and kept it with this posting. ..Bob]
# This is a shell archive.
# Remove everything above and including the cut line.
# Then run the rest of the file through sh.
#----cut here-----cut here-----cut here-----cut here----#
#!/bin/sh
# shar: Shell Archiver
# Run the following text with /bin/sh to create:
# ReadMe.Pz15
# Compile.it
# imgs.c
# pz.c
# bin.zuu
# This archive created: Wed Mar 8 15:20:11 1989
cat << \SHAR_EOF > ReadMe.Pz15
Pz15 - the "15" puzzle
Do you remember those cheap plastic puzzles with 15 white tiles
numbered 1 through 15 and an empty square in a 4 by 4 arrangement?
You know, at the check out racks in K-Mart or the local grocery?
The ones that you'd pry up a tile in the center, and then rearrange
them all to make it look like you solved it? Just to get your
sister mad? Well, here it is again!
To move the tiles around, just click on the tile that you want to
move (pretend the mouse pointer is your finger - except you don't
have to actually slide anything around). You can even click at
the end of a row or column of tiles and move all three over to
fill in the empty square.
To quit the game, use the close gadget, or send it a ^C (from the
parent CLI window, or with the 'break' command).
It's not a smart puzzle - it doesn't detect when you're done
(besides, there's different ways of solving it).
For those adventurous folks, some enhancements might include
a gadget to reshuffle the tiles, or animate the tiles sliding
around, or allow the puzzle to be resized.
The source for it is in "pz.c", and the tile images are in "imgs.c".
The source is pretty grody looking in places - lots of "unsigned
shorts". I'd love to hear of more tricks to get it even smaller yet.
It was just 4088 bytes with Lattice 4.0, now with 5.0 its 2808 bytes!
Have fun!
Mike Hall 2 S 461 Cherice Dr. Warrenville, IL 60555
312-393-6350 att!cuuxb!migh
SHAR_EOF
cat << \SHAR_EOF > Compile.it
lc -ad -M imgs
lc -w -v -Lcdn -M pz imgs
rename pz Pz15
SHAR_EOF
cat << \SHAR_EOF > imgs.c
/*
* image data for the puzzle tiles (empty, numbers 1 thru 15)
*/
unsigned short id0[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id1[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc001,0xc006,
0xc003,0xc006,0xc007,0xc006,0xc001,0xc006,0xc001,0xc006,
0xc001,0xc006,0xc007,0xf006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id2[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
0xc00e,0x7006,0xc000,0x7006,0xc001,0xc006,0xc007,0x8006,
0xc00e,0x0006,0xc00f,0xf006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id3[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
0xc00e,0x7006,0xc000,0x7006,0xc001,0xe006,0xc000,0x7006,
0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id4[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc003,0xe006,
0xc007,0xe006,0xc00e,0xe006,0xc01c,0xe006,0xc01f,0xf806,
0xc000,0xe006,0xc000,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id5[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xf006,
0xc00e,0x0006,0xc00f,0xe006,0xc000,0x7006,0xc000,0x3006,
0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id6[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xc006,
0xc00e,0x0006,0xc01c,0x0006,0xc01f,0xc006,0xc01c,0xe006,
0xc01c,0xe006,0xc00f,0xc006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id7[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc01f,0xe006,
0xc018,0xe006,0xc000,0xe006,0xc001,0xc006,0xc003,0x8006,
0xc003,0x8006,0xc003,0x8006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id8[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc007,0xe006,
0xc00e,0x7006,0xc00e,0x7006,0xc007,0xe006,0xc00e,0x7006,
0xc00e,0x7006,0xc007,0xe006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id9[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc00f,0xc006,
0xc01c,0xe006,0xc01c,0xe006,0xc00f,0xe006,0xc000,0xe006,
0xc001,0xc006,0xc007,0x8006,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id10[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
0xc0f0,0xe706,0xc1f0,0xe706,0xc070,0xe706,0xc070,0xe706,
0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id11[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc038,0x1c06,
0xc078,0x3c06,0xc0f8,0x7c06,0xc038,0x1c06,0xc038,0x1c06,
0xc038,0x1c06,0xc0fe,0x7f06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id12[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1c06,0xc070,0x7806,
0xc070,0xe006,0xc1fc,0xff06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id13[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x7e06,
0xc0f0,0xe706,0xc1f0,0x0706,0xc070,0x1e06,0xc070,0x0706,
0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id14[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0x3e06,
0xc0f0,0x7e06,0xc1f0,0xee06,0xc071,0xce06,0xc071,0xff86,
0xc070,0x0e06,0xc1fc,0x0e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
unsigned short id15[]={
/*-------------- plane 0 ---------------*/
0xffff,0xfffe,0xc000,0x0006,0xc000,0x0006,0xc070,0xff06,
0xc0f0,0xe006,0xc1f0,0xfe06,0xc070,0x0706,0xc070,0x0306,
0xc070,0xe706,0xc1fc,0x7e06,0xc000,0x0006,0xc000,0x0006,
0xffff,0xfffe,
};
SHAR_EOF
cat << \SHAR_EOF > pz.c
/*
* 15 puzzle
*/
#include <intuition/intuition.h>
#include <libraries/dos.h> /* just for SIGBREAKF_CTRL_C */
#include <proto/intuition.h>
#include <proto/exec.h>
extern struct IntuitionBase *IntuitionBase;
extern struct GfxBase *GfxBase;
#define NPZ 4 /* the square puzzle is NPZ x NPZ */
#define PZ_MT 0 /* the value of the "empty" tile */
char pz[NPZ][NPZ]; /* the puzzle array */
int mtr, mtc; /* location of the "empty" tile */
#define R0 11 /* origin row/col of upper left */
#define C0 4
#define RS (IMG_HT+1) /* row/col scaling factors (match images!!) */
#define CS (IMG_WID+3)
#define IMG_WID 0x1f /* from the output of 'brush' */
#define IMG_HT 0xd
struct Image img = { /* shared Image struct for all "tiles" */
0,0, IMG_WID,IMG_HT, 1, NULL, 1,0, NULL
};
/* the image data (in chip ram!) */
extern short id0[], id1[], id2[], id3[], id4[], id5[], id6[], id7[],
id8[], id9[], id10[], id11[], id12[], id13[], id14[], id15[];
short *imgs[] = { /* array of pointers to the image data arrays */
id0, id1, id2, id3, id4, id5, id6, id7,
id8, id9, id10, id11, id12, id13, id14, id15
};
#define W_WID 141
#define W_HT 68
struct NewWindow newin = {
100,50, W_WID,W_HT, 2,-1,
MOUSEBUTTONS | CLOSEWINDOW | REFRESHWINDOW,
WINDOWDEPTH | WINDOWCLOSE | WINDOWDRAG | SIMPLE_REFRESH,
NULL, NULL, "Pz15", NULL, NULL, 0,0, 0,0, WBENCHSCREEN
};
struct Window *win = NULL;
struct RastPort *rp = NULL;
/* Lattice likes prototypes: */
void putpiece(unsigned short, unsigned short, unsigned short);
void refrow(unsigned short), refcol(unsigned short);
short pzmove(unsigned short, unsigned short);
void byewin(long);
/*
* Repaint a single tile.
*/
void putpiece(r, c, v)
register unsigned short r, c, v;
{
img.ImageData = imgs[v];
DrawImage(rp, &img, (long) c*CS+C0, (long) r*RS+R0);
}
/*
* Repaint a specified row.
*/
void refrow(r)
register unsigned short r;
{
register unsigned short c;
for ( c = 0; c < NPZ; c++ )
putpiece(r, c, (unsigned short)pz[r][c]);
}
/*
* Repaint a specified column.
*/
void refcol(c)
register unsigned short c;
{
register unsigned short r;
for ( r = 0; r < NPZ; r++ )
putpiece(r, c, (unsigned short) pz[r][c]);
}
/*
* Move the "empty" tile (MT) to the "moused" row and column.
*/
short pzmove(mr, mc)
unsigned short mr, mc;
{
register unsigned short r, c; /* row/col counters */
register short ir, ic; /* row/col increments */
if ( mtr == mr ) /* Are we in the same row as MT? */
ir = 0; /* yes, row-inc is zero */
else
ir = (mtr < mr) ? 1 : -1; /* yes, row-inc is +/-1 */
if ( mtc == mc ) /* Are we in the same col as MT? */
ic = 0; /* yes, col-inc is zero */
else
ic = (mtc < mc) ? 1 : -1; /* yes, col-inc is +/-1 */
if ( ir == 0 && ic == 0 ) /* If in same row and col as MT... */
return 0; /* ... nothing to do */
if ( ir != 0 && ic != 0 ) /* If not in either row or col as MT... */
return -1; /* ... too much to do */
/* "double-loop", but really only r _or_ c gets changed */
for ( r = mtr, c = mtc; ; r += ir, c += ic ) { /* start at MT */
pz[r][c] = pz[r+ir][c+ic]; /* shift pieces towards MT */
if ( r == mr && c == mc ) /* until we hit the 'moused' position */
break;
}
pz[mr][mc] = PZ_MT; /* mark the new empty square */
mtr = mr;
mtc = mc;
if ( ir == 0 ) /* update the display */
refrow(mr); /* either change a row */
else
refcol(mc); /* or a column */
return 1; /* say there was just enough to do */
}
/*
* Refresh the entire puzzle.
*/
void pzref()
{
register unsigned short r;
for ( r = 0; r < NPZ; r++ )
refrow(r);
}
/*
* Setup the puzzle array.
*/
void pzinit()
{
register unsigned short r, c, i;
i = 0;
for ( r = 0; r < NPZ; r++ )
for ( c = 0; c < NPZ; c++ )
pz[c][r] = i++; /* scramble a little */
}
/*
* Get mouse clicks and handle them.
*/
void dopuz()
{
register struct IntuiMessage *msg;
register unsigned short r, c;
unsigned long class;
unsigned short code;
long flags, ret;
flags = (1L << win->UserPort->mp_SigBit) | SIGBREAKF_CTRL_C;
/* loop, get mouse clicks, call pzmove() with reduced coords */
for ( ; ; ) {
ret = Wait ( flags );
while ( msg = (struct IntuiMessage *)GetMsg(win->UserPort) ) {
class = msg->Class;
code = msg->Code;
r = (msg->MouseY - R0) / RS;
c = (msg->MouseX - C0) / CS;
ReplyMsg((struct Message *)msg);
if ( class == MOUSEBUTTONS && code == SELECTDOWN ) {
(void)pzmove(r, c);
}
else if ( class == REFRESHWINDOW ) {
pzref();
}
else if ( class == CLOSEWINDOW ) {
return;
}
}
if ( ret & SIGBREAKF_CTRL_C ) {
return;
}
}
}
/*
* Shut the window; put back the things we borrowed.
*/
void byewin(r)
long r;
{
if ( win )
CloseWindow(win);
if ( GfxBase )
CloseLibrary(GfxBase);
if ( IntuitionBase )
CloseLibrary(IntuitionBase);
_exit(r);
}
/*
* Open some libraries and a window.
*/
void mkwin()
{
if ( (IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 0L)) == NULL )
byewin(-100L);
if ( (GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0L)) == NULL )
byewin(-101L);
if ( (win = (struct Window *)OpenWindow(&newin)) == NULL )
byewin(-102L);
rp = win->RPort;
}
/*
* FINALLY, here's where it all starts.
*/
void _main()
{
mkwin(); /* open up our window */
pzinit(); /* initialize the puzzle */
pzref(); /* and show it */
dopuz(); /* play it, until we close or get a ^C */
byewin(0L); /* then close the window and exit */
}
SHAR_EOF
cat << \SHAR_EOF > bin.zuu
begin 644 bin.zoo
M6D]/(#(N,#`@07)C:&EV92X:``#<I\3]*@```-;___\"``$````````!W*?$.
M_0(!.`@``'$````P$E">WC#X"@``QP<```$```````````!0>C$U````````P
M````"@`07^\`````I`%`````0"DC*````0`8,$^@08$"#AH,(##`)2```F01]
M."!=PTLDD)``D"3?P2,>!_*3`P`$#X-:P`@P$2P*LG_\6.`!0""%$P(T4CPA=
MP$,(*P(X3+@)0`$.`!$G`<``X,25/V<IU@#`1`"&DE4`6)T1"`?$`TBO:!H`I
M9!!0"B`$`(2)Z`*$5%;1D,45@08`A&G)\((00%)"AA1)"!"!%D@*("%G#`L`(
M\L_?)V!5#M]!4%+`%$#4`GV0)1`$@"F"7/ZS]X%72<^@/\3R[#F*LG_X1#QY!
MD0",0#Q1`>A("^>/X6@_U0H4%F0=`"Y-_0$J?CPYH[-`7P`@`02$BNEG)+!@P
M4P`,""`B4`A,$:1JTW^"1%P'<48#B:0#VIT7!QW(&07E$'T_49<R*1!L1(<`D
M$FP,P`\(=9&00ET$".:$+@/@\^``W!@%!@$@2$>`=""P0``*9V`(A!.0/,B3Z
M3#2)P!T8R8DQH3-*_(1#>R)X:!\!YW&#(HZN_,.'BD`E9P@('[@0(`].U`$'D
M&6#0,H0^=AG55#_8G-7=&>PD2<8;<QB9AAARA"%''DQ5`1L2YQP`@`_2<<"#2
M=![HP*%1,!10SG+L`$!!"G!0!H`"=!H@AP@F4H`%("3)<,`+$#$`AP,F$B#'K
M`H0!"(`C0^0)`*-V90@``R)(!\%V!6!QGB-,?`,`.$YTD22:`ZPI'0-\```'Y
M`;P`088(B1Y03B!!L$,`$M$$`XTQ$$"`!"`_`/"#`3\<L-8_<'#QA!1&@(%-1
MJ@``\^HYL;+Y::VWYKIKH@;\&NRPQ4)S3+++-AOML]/B8"VVVG+K;1U.F(D/Y
MFM+!T`(`",C@(1:R`&$&`7H```8#"9-!`!P!J`3'/]<)_"<-'FI!B\($S/3P)
MQQ)3;/$_XBE1A!D**$&$&098*)`@*I^!@,LA7@P&'2X$P((`=/J*Y[`B(#$--
M,-(8`T(!T!R1*`"_%@L"`=`8`0TP$D#B2QL$P\P+UPJ<88`W17!#!!C*T#DPR
M`G>N2RPP&BMPM1`0R+!V#N5AD0-:6JC,\@\!K.6/-%0\`08"S4X+0.$4<TM/M
MJTF^<(`?MA+@BZX,1"LX*X5+<008[KCPP;=J-DSYK9>300*YN.J*`;KJ"DNLU
ML<<L#0$@4A2!KSB>@V$-MZSR:Z8Z:#X@@8H`*`)"&@!8810$XCT@1P#AA`)`D
M$!``L$(0_[@#0@O=[YB<,"LPI@[RRC-OA?A.,6)"=0N<@84**^B)0_T8P%$/F
M-%(5#4P@_`"``UR@E/J!(`M`0,+_`EBCHRQ!2'W2!2#,(`$XH`$7"LL<M*0%^
M`']0`0N&0\6M)`BS:7$`#)Q@0"$0`@`S4`(,"D#`P`CP#W9LY1]Z2!42X`&Y5
M.J`I``)PP:QBE+PS,,!2BB"5J7J$BQ@5@`M&5-$3V></,3@1"U'D#A:H*`;)\
M/0@`D@!AJH``B,@Y(%-@-`K[J&0E+"AA@@/"PS\X$09+@!"-I%#C3'C$1B`\>
M\8TL0X(<-S$M/(`P6`#0@A+/DQ.(*`*0"A#D/S0Q+2V`$(D+`H`,+L6"+R0I>
M#)(0G!8$QP/!*4((IYB6#4"8I%;Z,$VRL@L/6!`A)1AA#6T1E`&"$8QU<4$'?
M,*",$@IP!@P@H```$``%0;#+7@J+"R\(I@"^:,DG3"%;S@#!`10HG0?M`QEB?
M5%7P%$).`*!)DR;@#A-`$#\+D&`*=*H?`D2P!/;]PP4F4`(8S!$)9*0`"06`R
MPC\+P(14,8$I=1"(Y(1(L!@1@`4A^J(/1'``4K&H1Q4"@.B25$Z%H&DI&S%!#
M`)`@!"0,@1C!,`8P@!$,:@R!I$(0`C0$P2T&?`N(1D&*0)9"16<04`"'V"D`H
ME'"(A5D(!`Z%*`8`]%`2*0%D%G(4!9KU('^8HW#:'&,9ZQ`&6G#4(`/05#(7V
M8A`&&,0`Y!R`/"`R`'48Y!\*^0``&A"1@S"DG+@PB*8"X)F(4*$AB&B(:2("3
M#X1L))E80`@C$`(,A-"#(N(9"!<H`@F*$`,*>HA!#0Q"!DT"H!$`(((`X)I,6
MLPK$"1TUR%]36\Z[DC,-;J!#'=)`AS2\P0U>`I.8R'2&,%DP#6/H$AN^%*8Q%
M'>0?R/5'8P%@@.4V5R#/9:YSIPM=ZDJWNM!%;F.TJUSL2C<`P&CN`,(+C`.03
M%[S-12\PU'L`>$3WO=SEKG6;>P!P--<!<'AN?M=+W@,`XK[2?8![YQO?Y,ZW$
MO/8%!G[UF]X$V^J^^ZWO>YU;X,8<>``)EK""$\R!!'\`'\]UL(.OR]P*=Y?$P
MS14P@%/LX/TJ!<+T'3%\DRM?[]*7O`Z0+@>D^P'R=KBY/P;&`\AK8Q,?^`,)T
MQH"(TTO>`?P7&$X6[Y.+3&,#VQC!,%9PA!.\8"W'>,+9K;*%KSQD(',XP0]8C
M,G_I.V44&_G*</!#<^%QCEW2N;EPJ#,P\HSG.@>#'W(FL)A//&$<<*"Y>.!!0
M<_'!A^8:VM&'!L:C@>&//X"YQ(,^<)SG[&=X'`#/D88#'O!LWS__X](&>#.*%
M]QSH.P?#TWCV`)X_O6<_`QK5JIXP''PP9SF_VAW-C8,S@OT/0^S9`;OD![(%-
MO5TKK_IB<RXU//PQ:SP/H,_)#C25&P.`R%)$K!$@JT"@8)"#"@0)!B&"02`BN
MD*0```<&H8%!EB(0%AC$VX<MB4%V+!`,&(0"!J%#6N41$-RGQ/T"`4L)``")!
M"```DA$%9:`GM0,``,(````!````````````4'HQ-2YI;F8``````!0`$'8+7
M"@!0>C$U+FEN9F\```"D`4````!`*2,H``#'00`0`(#!@P>A`%@!H`"``00!P
M@!B%L*+%BP\15`3A!<7!#AA#(E2H`H```"1LP8(HLJ7+ES!CRIQ)LZ;-FSAI$
M?OC'\Q\^A#M[_CSH84P>3MOP("R:P=`WI40'].`T#*K!H#R'&O0P+XROI$N'K
MY3'DS"H`#S/:&`)[$*O/I=O:V&*[=8_<;&8];"A@:)A6`&[_>OC6!A:PO,O>9
MV#J\=,.!08S;]GPK66C.RY@S:][,N;/GSZ!#BQZ-4Z/!`7#T``@(W*?$_0(!S
M*@H``)()``"2$0-EJ#+X````F`````$```````````!T:6QE,`!N9@``````W
M"@`09ZH`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!?
M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(>
M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL
MOXO`#!I`JY8M3[=K(:9]*[=M7;H&Y\;-:Y<O7@!Z+Y;]=Q9B0-RGQ/T"`1(+7
M``!Q"@``DA$&9>.)^````*$````!````````````=&EL93$`;F8```````H`,
M$-1,`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40`H
M`@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G5
M1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+[
MP`P:0*L6;0!@:R$"&P`7[8&Z<M_&-0A,KUN\?`_`VPL@+4^VAR&6_7<68D#<+
MI\3]`@'Z"P``60L``)(1\612K?@```"A`````0```````````'1I;&4Q,`!F:
M```````*`!!A[@````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H$
M`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`S
M/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R>
M0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8'3M`@`&IZY;OW+[Z@W&#RY;GH?U$
MEOUW%F)`W*?$_0(!XPP``$$,``"2$?)DV/7X````H@````$```````````!T:
M:6QE,3$`9@``````"@`0!9(`````I`%`````0"DC*```C3R1T@2`07A)F`AI'
MLA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y/
M(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:UN
M^M2@D"=$LD!$\Z^LOXO`#!I`JQ8M#@YK(0+#PR.N06#X^-@%`.SMWKYPW0:68
MZ^_/W[9R$1LL^^\LQ(#<I\3]`@'0#0``*@T``)(1]&2I[/@```"F`````0``L
M`````````'1I;&4Q,@!F```````*`!"_]`````"D`4````!`*2,H``"-/)'2)
M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J
M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$
M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLA`H-W+J[!8/`.V`4`D
M#`Z'O7WQ`(8#;F\P?O\`MY6[V ?V<A!@3<I\3]`@&[#@``%PX``)(1]62ZS
M2?@```"D`````0```````````'1I;&4Q,P!F```````*`!!MXP````"D`4``M
M``!`*2,H``"-/)'2!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&G
M-`D"!2(#:-"`P0`!"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&`
M^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%BT</VLAW
M`H-W+J[!8/`.V`4`#(Z'O7WUNJU[,1@_N&QY)MY;]M]9B`$!W*?$_0(!IP\`_
M``(/``"2$?9DE0WX````I0````$```````````!T:6QE,30`9@``````"@`0A
M\^H`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"7
M!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"=':
M("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`T
M#!I`JQ8M'!]K(0*#YR>NP6#PW-D%`"R.L[U]_QERZV!O,'Z%V?)4O+?LO[,0%
M`P+<I\3]`@&4$```[@\``)(1]V3H>O@```"F`````0```````````'1I;&4Q+
M-0!F```````*`!`VRP````"D`4````!`*2,H``"-/)'2!(!!>$F8"&FR$`D1F
M@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."``#DB)8@02
MB`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E-K7ZU*"0-
M)T2R0$3SKZR_B\`,&D"K%BV<?VLA`H,'+J[!8/#\V04`#,Z!O7T'`(9S;F\PI
M?GX`MY6[V ?V<A!@3<I\3]`@%_$0``VQ```)(1!V6W)?@```"D`````0``O
M`````````'1I;&4R``!F```````*`!#,]P````"D`4````!`*2,H``"-/)'2H
M!(!!>$F8"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!J
M"0(H*."``#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X$
M%$#1HP:E-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT!<&LA`G,`)Z[!M'71!@!F7
M%P"P`X#ZSN6)]@$\P6WE)C98]M]9B`$!W*?$_0(!9Q(``,81``"2$0AE[,CX%
M````H0````$```````````!T:6QE,P``9@``````"@`0"H(`````I`%`````T
M0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)D
M`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$_
M*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`7!K(0)S&
M`">NP;1UT0:`RS:O7+IV`0![&S@M3[:'(9;]=Q9B0-RGQ/T"`5`3``"N$@``G
MDA$(9;^+^````*(````!````````````=&EL930``&8```````H`$+9]````*
M`*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!`>
M`"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`0
M%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6!
M[0!P:R$".P`7K8.Z<CG@-0CL`[ZX?`'L!9!V<%J>;!%#+/OO+,2`W*?$_0(!]
M.!0``)<3``"2$0IEJFCX````H0````$```````````!T:6QE-0``9@``````]
M"@`0X9,`````I`%`````0"DC*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!"
M1``"!%Q4L$``(`#(AC0)`@4B`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(>
M%"='("(PJ$`5@``#!O@$*I2H4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LL
MOXO`#!I`JQ;M`WAK(0)SP-,MN+@&T\+!"R`M#+YS]Z(]<)=M7;EM(9;]=Q9BK
M0-RGQ/T"`2`5``!_%```DA$*957&^````*$````!````````````=&EL938`Z
M`&8```````H`$%TB`````*0!0````$`I(R@``(T\D=($@$%X29@(:;(0"1&#R
M`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!``$)`B@HX(``.2(EB!"(7
M!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&-3@40-&C!J4VM?K4H)`GL
M1+)`1/.OK+^+P`P:0*L6[0%@:R$"<\`3+8>Z<C_`M0LNKD%@'/JB?;!7;EO#_
M>`V6_7<68D#<I\3]`@$)%@``9Q4``)(1"V5+E?@```"B`````0``````````W
M`'1I;&4W``!F```````*`!!C,@````"D`4````!`*2,H``"-/)'2!(!!>$F8=
M"&FR$`D1@P`H`/@`H`%$``($7%2P0``@`,B&-`D"!2(#:-"`P0`!"0(H*."`'
M`#DB)8@0B`0`/`!@8(@4)T<@(C"H0!6```,&^`0JE*A1I`>6!C4X%$#1HP:E\
M-K7ZU*"0)T2R0$3SKZR_B\`,&D"K%NT'<&LA`L,`EVU=N0&`Q34(;`"@O0#Z>
M_D7K%W!:GFP10RS[[RS$@-RGQ/T"`>\6``!0%@``DA$,99,8^````)\````!\
M````````````=&EL93@``&8```````H`$'GN`````*0!0````$`I(R@``(T\O
MD=($@$%X29@(:;(0"1&#`"@`^`"@`40``@1<5+!``"``R(8T"0(%(@-HT(#!,
M``$)`B@HX(``.2(EB!"(!``\`&!@B!0G1R`B,*A`%8```P;X!"J4J%&D!Y8&8
M-3@40-&C!J4VM?K4H)`G1+)`1/.OK+^+P`P:0*L6[0%P:R$"<P`GKL&Y==W"K
M14O7+@"\?H&]#=Q6;F ?^=A1@0W*?$_0(!V!<``#87``"2$0QEJ5+X````6
MH@````$```````````!T:6QE.0``9@``````"@`0F/``````I`%`````0"DC#
M*```C3R1T@2`07A)F`AILA`)$8,`*`#X`*`!1``"!%Q4L$``(`#(AC0)`@4B!
M`VC0@,$``0D"*"C@@``Y(B6($(@$`#P`8&"(%"='("(PJ$`5@``#!O@$*I2H\
M4:0'E@8U.!1`T:,&I3:U^M2@D"=$LD!$\Z^LOXO`#!I`JQ;M`V!K(0+C`"ZN>
MP;EUW>:5"V#OW0!PT1X`9!=`6IYL$4,L^^\LQ(#<I\3]`@``````````````<
H``````````````````````````````````````````````````#\@P``_
``
end
size 6160
SHAR_EOF
# End of shell archive
exit 0
--
Bob Page, U of Lowell CS Dept. page@swan.ulowell.edu ulowell!page
Have five nice days.